const Joi = require('joi');
const ApiError = require('../utils/ApiError');

/**
 * 验证请求体的中间件
 * @param {Joi.Schema} schema - Joi验证模式
 * @returns {Function} Express中间件函数
 */
const validate = (schema) => (req, res, next) => {
    try {
        // 合并请求体、查询参数、路由参数
        const dataToValidate = {
            ...req.body,
            ...req.query,
            ...req.params
        };

        // 执行验证
        const { error, value } = schema.validate(dataToValidate, {
            abortEarly: false, // 返回所有错误，而不是在第一个错误时停止
            allowUnknown: true, // 允许对象包含被模式忽略的未知键
            stripUnknown: true // 删除未知键
        });

        // 如果有验证错误
        if (error) {
            // 提取错误信息
            const errorMessages = error.details.map(detail => detail.message).join(', ');
            throw new ApiError(400, `验证失败: ${errorMessages}`);
        }

        // 将验证后的数据附加到请求对象
        req.validatedData = value;
        next();
    } catch (error) {
        next(error);
    }
};

module.exports = validate;